home *** CD-ROM | disk | FTP | other *** search
- ***********************************************************************************
- ** Written by Dino Papararo 08-December-2001
- **
- ** FUNCTION
- **
- ** Mandeln68K -- perform Z = (Z^(2^n)) + C (1 <= n <= 11)
- **
- ** SYNOPSIS
- **
- ** WORD Mandeln68K (ULONG Iterations,ULONG Power,double Cre,double Cim)
- **
- **
- ** DESCRIPTION
- **
- ** This function tests if a point belongs or not at Mandelbrot set
- **
- ** Optimized for pipelines of 68882+ coprocessors
- **
- ** NOTICE: ALL VARIABLES ARE INTO REGISTERS FOR FULL SPEEEED
- **
- ** d0:Iterations d1:Power
- **
- ** fp0:Cre fp1:Cim fp2:Zr fp3:Zi fp4:Zr2 fp5:Zi2/Dist fp6:MaxDist fp7:Not used :-)
- ***********************************************************************************
-
- * MACHINE 68060
-
- XDEF _Mandeln68K
-
- section data
-
- Radius dc.x 4.0 * Store Radius in data mem
- Power dc.w 0 * Store Power in data mem
-
- section code
-
- _Mandeln68K:
-
- fmove.x fp1,fp3 * Zi = Cim
- fmove.x fp0,fp2 * Zr = Cre
- move.w d1,Power * Save Power from d1 to mem
- fmove.x Radius,fp6 * Save Radius from mem to fp6
- bra.w PowerLoop * Go to PowerLoop
-
- Start:
- move.w Power,d1 * Load Power from data mem to d1
-
- PowerLoop:
-
- fmove.x fp3,fp5 * zi2 = zi
- fmul.x fp2,fp3 * zi = zr * zi
- fmul.x fp2,fp2 * zr = zr * zr
- fmul.x fp5,fp5 * zi2 = zi * zi
- fmove.x fp2,fp4 * zr2 = zr
- fadd.x fp3,fp3 * zi += zi
- fsub.x fp5,fp2 * zr -= zi2
- dbra.w d1,PowerLoop * if --Power != -1 go to PowerLoop
-
- fadd.x fp4,fp5 * Dist = zr2 + zi2
- fcmp.x fp6,fp5 * Compare MaxDist & Dist
- fbgt.w End * if Dist > MaxDist then goto End
-
- fadd.x fp1,fp3 * zi += Cim
- fadd.x fp0,fp2 * zr += Cre
- dbra.w d0,Start * if --Iterations != -1 go to Start
- clr.w d0
-
- End:
-
- rts * return Iterations
-
- end
-